#pragma once
#include <lcir/IR/ExprTemplate.h>
// 提供一些常用的模板
namespace lcir {
class BinaryExpr : public ExprTempCRTP<BinaryExpr> {
 public:
  BinaryExpr(Expression *expr) : ExprTempCRTP(expr) {}
  Operand *getLhsOperand() { return operands[0]; }
  Operand *getRhsOperand() { return operands[1]; }
  Value *getLhs() { return operands[0]->getValue(); }
  Value *getRhs() { return operands[1]->getValue(); }
};
/**
 * @brief 该模板标记的Op在D2D变换和死代码删除时不会删掉
 */
class LiveNode : public ExprTempCRTP<LiveNode> {
 public:
  LiveNode(Expression *expr) : ExprTempCRTP(expr) {}
};

/**
 * @brief 该模板标记为Op为终结符
 */
class Terminator : public ExprTempCRTP<Terminator> {
 public:
  Terminator(Expression *expr) : ExprTempCRTP(expr) {}
};
};  // namespace lcir